package startThreadDemo;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/*
实现线程的第三种方式
1.编写类实现Callable接口
2.重写call方法
3.将线程任务代码写在call方法中
4.创建线程的任务资源对象
5.创建线程的任务对象,封装资源
6.创建线程对象，传入线程任务
7.调用start方法开启线程
 */
public class ThreadDemo3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建线程的任务资源对象
        MyCallable mc = new MyCallable();
        //创建线程的任务对象,封装资源
        FutureTask<Integer> task1 = new FutureTask<>(mc);
        FutureTask<Integer> task2 = new FutureTask<>(mc);
        //创建线程对象，传入线程任务
        Thread t1 = new Thread(task1,"线程1");
        Thread t2 = new Thread(task2,"线程2");
        //使用线程对象调用start开启线程
        t1.start();
        t2.start();
        //用task去接结果
        Integer re1 = task1.get();
        System.out.println(t1.getName()+" "+re1);
        Integer re2 = task2.get();
        System.out.println(t2.getName()+" "+re2);
    }
}
//返回结果是什么类型，泛型就写啥
class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = 0; i < 100; i++) {
            sum+=i;
            System.out.println(Thread.currentThread().getName()+" "+"sum="+sum);
        }
        return sum;
    }
}